home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Amiga Public Domain Connection / APDC Disk #005 - Amiga Basic Programs (198x)(Amiga Public Domain Connection)(US)[WB].zip / APDC Disk #005 - Amiga Basic Programs (198x)(Amiga Public Domain Connection)(US)[WB].adf / LunarLander < prev    next >
Text File  |  1988-03-13  |  15KB  |  457 lines

  1.  
  2.  
  3.  
  4.  
  5. mode%=1     'mode%=1 production, mode%=0 for debug
  6. 'Lunar Lander Game Program
  7. 'By: Brian Allston 3/20/86
  8. '
  9. start:
  10.    PRINT "Lunar Lander Game"
  11.    PRINT "Amiga BASIC version by:"
  12.    PRINT "Brian Allston      3/20/86"
  13.    PRINT " "
  14.    PRINT " "
  15.    PRINT " "
  16.    PRINT "          Attach amplifier and speakers for voice"
  17.    DIM moonscape.h%(641)
  18.    SAY(TRANSLATE$(""))
  19.    RANDOMIZE TIMER
  20.    GOSUB initscreen 
  21.    WIDTH 80
  22.    CLS
  23.    FOR i=1 TO 20
  24.    
  25.       LOCATE i,i*2+10:PRINT"Lunar Lander"
  26.    NEXT i
  27.    IF mode%=0 THEN mode%=5
  28.    MENU mode%,0,1,"Options"
  29.    MENU mode%,1,1,"Start Mission"
  30.    MENU mode%,2,1,"Quit         "
  31.    MENU mode%,3,1,"Help         "
  32.    IF mode%<>1 THEN GOTO dmsave   
  33.    MENU 2,0,0,""         'disable default menus
  34.    MENU 3,0,0,""
  35.    MENU 4,0,0,""
  36.    dmsave:
  37.    RESTORE moonscape
  38.    FOR i=1 TO 640
  39.       READ moonscape.h%(i)          'Input horizon definition
  40.    NEXT i
  41.    CLS  
  42.    speech$="Welcome to Lunar Lander."
  43.    LOCATE 6,40-CINT(LEN(speech$)/2):PRINT speech$
  44.    SAY TRANSLATE$(speech$)    
  45.    speech$="The object of your mission is to make a perfect landing on your base." 
  46.    LOCATE 12,40-CINT(LEN(speech$)/2):PRINT speech$
  47.    SAY TRANSLATE$(speech$)  
  48.    RESTORE lander
  49.    ship$=""
  50.    FOR i=1 TO 62
  51.       READ ship.data%
  52.       ship$=ship$+CHR$(ship.data%)
  53.    NEXT i
  54.    speech$="Land quickly, softly, and use as little fuel as possible."
  55.    LOCATE 18,40-CINT(LEN(speech$)/2):PRINT speech$
  56.    SAY TRANSLATE$(speech$)
  57.    speech$="Use Options Menu to start mission."
  58.    COLOR 1,2:LOCATE 22,40-CINT(LEN(speech$)/2):PRINT speech$;:COLOR 1,0
  59.    SAY TRANSLATE$(speech$)
  60.    menucheck:
  61.       MENU ON
  62.       ON MENU GOSUB getoption
  63.       SLEEP      
  64.       GOTO menucheck
  65.    getoption:
  66.       OBJECT.OFF
  67.       IF MENU(0) <> mode% THEN GOTO nomenu     
  68.       moption%=MENU(1)
  69.       MENU OFF
  70.       IF moption%=0 THEN GOTO getoption
  71.       ON MENU GOSUB 0
  72.       ON moption%+1 GOTO nomenu,main,exit1,showhelp
  73.       nomenu:
  74.       RETURN
  75.    showhelp:
  76.       CLS
  77.       WINDOW 3,"Mission Objective",(20,20)-(600,130),0,1
  78.       WINDOW OUTPUT 3
  79.       LOCATE 1,1:COLOR 1,0
  80.       PRINT "   Your mission is to pilot your landing craft to a 'soft' landing"
  81.       PRINT "   on the lunar base.  Use your thrusters (use the left mouse"
  82.       PRINT "   button and cursor) on the control panel to accelerate the lander"
  83.       PRINT "   in the desired direction.  Your score is determined by combined"
  84.       PRINT "   speed, landing distance from base, fuel used, elapsed time."
  85.       PRINT ""
  86.       PRINT "   Hint: You always accelerate downward due to gravity and will "
  87.       PRINT "         only drift horizontally. Also, the lander will 'wrap-around'"
  88.       PRINT "         the side edges. So don't waste fuel on side thrust."
  89.       PRINT ""
  90.       PRINT "   Good luck!                Brian Allston (76515,1506)"
  91.       PRINT ""
  92.       COLOR 1,2:LOCATE 13,22:PRINT "Press left mouse button to continue.";:COLOR 1,0
  93.       keepopen:
  94.          IF MOUSE(0)=0 THEN GOTO keepopen
  95.       WINDOW OUTPUT 2   
  96.       WINDOW CLOSE 3
  97.       RETURN   
  98.    main:
  99.       GOSUB drawscreen        
  100.       GOSUB initlander
  101.       GOSUB updatedisplay
  102.       ON TIMER(.25) GOSUB updatevalues:TIMER ON
  103.       '
  104.       'Loop until lander touches the horizon
  105.       WHILE y&<horizon%
  106.          x&=OBJECT.X(1)
  107.          IF x&<6 OR x&>620 THEN
  108.             IF edgecheck<6 THEN 
  109.             border=-2
  110.             ELSE
  111.                border=-4
  112.             END IF
  113.             GOSUB edge
  114.          x&=OBJECT.X(1)
  115.          END IF
  116.          horizon%=moonscape.h%(x&)
  117.          y&=OBJECT.Y(1)+8
  118.          GOSUB updatedisplay
  119.      WEND
  120. '
  121. '   
  122. TIMER OFF
  123. 'Check for crash and compute score
  124. OBJECT.STOP 1
  125. computescore:
  126.    vterm=SQR(vx*vx+vy*vy)
  127.    xterm=ABS(basex-x&):IF xterm>305 THEN xterm=xterm-305
  128.    yterm=y-8
  129.    IF vterm>vcrash THEN 
  130.       IF OBJECT.Y(1)>150 THEN OBJECT.Y 1,140
  131.       SOUND WAIT
  132.       SOUND 180,40,180,0
  133.       SOUND 220,40,180,1
  134.       SOUND 260,40,180,2
  135.       SOUND 300,40,180,3
  136.       SOUND RESUME
  137.       yterm=OBJECT.Y(1)+8
  138.       xterm=OBJECT.X(1)+5
  139.       LINE (xterm,yterm)-(xterm-50,yterm-45),3
  140.       LINE (xterm,yterm)-(xterm+50,yterm-50),6
  141.       LINE (xterm,yterm)-(xterm-25,yterm-10),6
  142.       LINE (xterm,yterm)-(xterm+50,yterm-35),7
  143.       LINE (xterm,yterm)-(xterm-10,yterm-60),7
  144.       LINE (xterm,yterm)-(xterm+60,yterm-10),3
  145.       LINE (xterm,yterm)-(xterm-40,yterm-5),3
  146.       LINE (xterm,yterm)-(xterm+20,yterm-30),6
  147.       score&=0
  148.       landing$="You crashed!  There were no survivors."
  149.       landing1$="No."
  150.       GOTO displayscore2
  151.    END IF
  152.    landing$="You made a "
  153.    landing1$=landing$
  154.    IF vterm>vcrash/2 THEN
  155.       landing$=landing$+"hard "
  156.       landing1$=landing1$+"hard "
  157.    ELSEIF vterm>vcrash/4 THEN
  158.       landing$=landing$+"soft "
  159.       landing1$=landing1$+"soft "
  160.    ELSE
  161.       landing$=landing$+"perfect "
  162.       landing1$=landing1$+"perfect "    
  163.    END IF
  164.    score1=score&   
  165.    landing$=landing$+"landing, "
  166.    landing1$=landing1$+"landing, "
  167.    IF xterm>100 THEN
  168.       landing$=landing$+"far from the base."
  169.       landing1$=landing1$+"far from the base."
  170.    ELSEIF xterm>20 THEN
  171.       landing$=landing$+"near to the base."
  172.       landing1$=landing1$+"near to the base."
  173.    ELSE
  174.       landing$=landing$+"right on the base.  Congratulations!"
  175.       landing1$=landing1$+"right on the base.  Congratulations"
  176.    END IF
  177.    score1%=CINT(10*(1-vterm/vcrash))+1
  178.    score2%=CINT(15*(1-xterm/310))+1
  179.    score3%=CINT(5*fuel/ifuel)+1
  180.    score4%=CINT(5/etime)+1
  181.    score&=score1%*score2%*score3%*score4%
  182.    displayscore:
  183.       COLOR 1,0       
  184.       LOCATE 8,40-CINT(LEN(landing$)/2):PRINT landing$                  
  185.       SAY TRANSLATE$(landing1$)
  186.       LOCATE 11,30:PRINT USING "Your score is: #####";score&
  187.    RETURN      
  188.    displayscore2:
  189.       COLOR 1,0
  190.       LOCATE 8,40-CINT(LEN(landing$)/2):PRINT landing$
  191.       LOCATE 11,30:PRINT "Your score is 0."
  192.     RETURN
  193. '      
  194. 'Update lander velocity based upon "thrusters"    
  195. updatevalues:
  196.    etime=etime+(1/120)
  197.    vy=vy+gravity
  198.    IF fuel=0 THEN GOTO noaccel
  199.    mousestat%=MOUSE(0)
  200.       mx=MOUSE(1):my=MOUSE(2)
  201.       IF mousestat%=0 THEN
  202.       IF oldthrust%<>0 THEN GOSUB clearthrust
  203.       GOTO noaccel
  204.       END IF
  205.    mousecheck:
  206.       IF mx>=296 AND mx<=325 THEN
  207.          IF my>=157 AND my<=170 THEN thrust%=1:vy=vy-2
  208.          IF my>=173 AND my<=186 THEN thrust%=2:vy=vy+2
  209.       ELSEIF my>=164 AND my<=177 THEN
  210.          IF mx>=260 AND mx<=290 THEN thrust%=3:vx=vx-6
  211.          IF mx>=331 AND mx<=361 THEN thrust%=4:vx=vx+6
  212.       END IF
  213.       IF oldthrust%<>thrust% THEN GOSUB clearthrust
  214.       IF thrust%=0 THEN GOTO noaccel
  215.    showthrust:     
  216.       COLOR 1,6
  217.       IF thrust%=1 THEN LINE (297,158)-(324,169),6,bf:LOCATE 21,39:PRINT "UP";
  218.       IF thrust%=2 THEN LINE (297,174)-(324,185),6,bf:LOCATE 23,39:PRINT "DN";
  219.       IF thrust%=3 THEN LINE (261,165)-(289,176),6,bf:LOCATE 22,34:PRINT "<-";
  220.       IF thrust%=4 THEN LINE (332,165)-(360,176),6,bf:LOCATE 22,43:PRINT "->";
  221.       oldthrust%=thrust%
  222.       COLOR 1,0          
  223.    updatefuel:
  224.       fuel=fuel-8.3
  225.       IF fuel<0 THEN fuel=0
  226.       GOTO noaccel
  227.    clearthrust:
  228.       IF oldthrust%=0 THEN RETURN
  229.       COLOR 1,0
  230.       IF oldthrust%=1 THEN LINE (297,158)-(324,169),0,bf:LOCATE 21,39:PRINT "UP";
  231.       IF oldthrust%=2 THEN LINE (297,174)-(324,185),0,bf:LOCATE 23,39:PRINT "DN";
  232.       IF oldthrust%=3 THEN LINE (261,165)-(289,176),0,bf:LOCATE 22,34:PRINT "<-";
  233.       IF oldthrust%=4 THEN LINE (332,165)-(360,176),0,bf:LOCATE 22,43:PRINT "->";
  234.       oldthrust%=thrust%
  235.       RETURN
  236.    noaccel:
  237.       OBJECT.VX 1,vx
  238.       OBJECT.VY 1,vy
  239.       OBJECT.START 1
  240.       thrust%=0:mousestat%=0  
  241.    RETURN    
  242. '
  243. 'Let lander "wrap-around" the left and right borders
  244. wraparound:
  245.    border=COLLISION(1)
  246. edge:   
  247.    IF border=-1 THEN OBJECT.Y 1,1:GOTO restart
  248.    IF border=-3 THEN OBJECT.STOP 1:RETURN
  249.    IF border=-2 THEN OBJECT.X 1,619:GOTO restart
  250.    IF border=-4 THEN OBJECT.X 1,6
  251.    restart:
  252.       OBJECT.START 1
  253.    RETURN
  254. '
  255. 'Update Display Values
  256. updatedisplay:
  257.    TIMER STOP
  258.    COLOR 1,2
  259.    LOCATE 21,3:PRINT USING " ####.#";vy*(-17.6);
  260.    LOCATE 23,3:PRINT USING " ####.#";vx*5.5;
  261.    LOCATE 21,69:PRINT USING " ####.#";(horizon%-y&)*17.6;
  262.    LOCATE 23,69:PRINT USING " ####.#";fuel;
  263.    COLOR 1,0
  264.    TIMER ON
  265.    RETURN
  266. '
  267. 'Initialize lander position, velocity, and fuel terms
  268. initlander:
  269.    gravity=.5
  270.    ifuel=400:fuel=ifuel
  271.    x&=CINT(RND*610)+5
  272.    y&=1
  273.    vx=12
  274.    IF RND<.5 THEN vx=vx*(-1)
  275.    vy=2
  276.    vcrash=20
  277.    OBJECT.SHAPE 1,ship$
  278.    OBJECT.X 1,x&   
  279.    OBJECT.Y 1,y&             
  280.    OBJECT.VX 1,vx
  281.    OBJECT.VY 1,vy
  282.    OBJECT.ON 1
  283.    OBJECT.START 1
  284.    ON COLLISION GOSUB wraparound
  285.    horizon%=moonscape.h%(x&)
  286.    COLLISION ON
  287.    RETURN
  288. '
  289. 'Initialize window and game display
  290. initscreen:
  291.    SCREEN 1,640,200,3,2          'Define window parameters
  292.    WINDOW 2,"Lunar Lander",,8,1
  293.    PALETTE 4,.8,.6,.53           'tan     --
  294.    PALETTE 5,.33,.87,0           'green     | _Additional
  295.    PALETTE 6,1,0,0               'red       |  Colors
  296.    PALETTE 7 ,1,1,.13            'yellow  --
  297.    RETURN
  298. '
  299. drawscreen:
  300.    COLOR 1,3                     'Draw flight display window
  301.    LINE (0,0)-(640,200),3,bf
  302.    LINE (5,0)-(625,150),2,bf     
  303.    FOR i=1 TO 50                 'Draw stars
  304.       x=INT(RND*620)+5
  305.       y=INT(RND*150)
  306.       PSET(x,y),1
  307.    NEXT i
  308.    CIRCLE (580,50),75,0        'draw ringed planet
  309.    LINE (5,0)-(625,150),0,b     
  310.    CIRCLE (580,50),85,0,2.6,6,1/12              
  311.    CIRCLE (580,50),110,0,2.25,6,1/12
  312.    CIRCLE (580,50),150,0,2.05,6,1/12
  313.    PAINT (494,50),7,0
  314.    PAINT (580,58),7,0
  315.    PAINT (465,50),6,0
  316.    PAINT (580,60),6,0
  317.    PAINT (580,50),0
  318.    PAINT (580,70),0
  319.    CIRCLE (580,50),85,2,2.65,6,1/12              
  320.    CIRCLE (580,50),110,2,2.3,6,1/12
  321.    CIRCLE (580,50),150,2,2.08,6,1/12
  322.    '
  323.    LINE (625,0)-(640,150),3,bf  'draw horizon
  324.    LINE (625,150)-(5,150),4
  325.    LINE (5,150)-(5,126),4
  326.    LINE (5,126)-(25,138),4
  327.    LINE (25,138)-(60,138),4
  328.    LINE (60,138)-(70,144),4
  329.    LINE (70,144)-(80,144),4
  330.    LINE (80,144)-(120,120),4
  331.    LINE (120,120)-(140,100),4
  332.    LINE (140,100)-(360,130),4
  333.    LINE (360,130)-(500,130),4
  334.    LINE (500,130)-(550,145),4
  335.    LINE (550,145)-(625,136),4
  336.    LINE (625,136)-(625,150),4
  337.    PAINT (6,148),4                'paint moonscape
  338.    'CIRCLE (20,140),7,2,1/25
  339.    'CIRCLE (130,130),15,2,1/25
  340.    LINE (5,0)-(625,150),2,b       'cover planet edge
  341.    '
  342.    basex=CINT(RND*600)+5               'randomly position base
  343.    basey=moonscape.h%(basex)
  344.    LINE (basex,basey)-STEP(15,6),6,bf
  345.    LINE (basex+1,basey-20)-STEP(13,22),2,bf
  346.    ' 
  347.    COLOR 1,3:           'Draw Instrument Panel
  348.    LOCATE 20,3:PRINT "V-SPEED";
  349.    LOCATE 22,3:PRINT "H-SPEED";
  350.    LOCATE 20,69:PRINT "Altitude";
  351.    LOCATE 22,69:PRINT "  Fuel ";
  352.    LINE (10,160)-(80,167),2,bf
  353.    LINE (10,176)-(80,184),2,bf
  354.    LINE (540,160)-(610,167),2,bf
  355.    LINE (540,176)-(610,184),2,bf
  356.    LINE (296,157)-(325,170),0,bf
  357.    LINE (296,173)-(325,186),0,bf
  358.    LINE (260,164)-(290,177),0,bf
  359.    LINE (331,164)-(361,177),0,bf
  360.    COLOR 1,0
  361.    LOCATE 21,39:PRINT "UP";
  362.    LOCATE 22,34:PRINT "<-";
  363.    LOCATE 22,43:PRINT "->";
  364.    LOCATE 23,39:PRINT "DN";
  365.    LINE (296,157)-(325,170),2,b
  366.    LINE (296,173)-(325,186),2,b
  367.    LINE (260,164)-(290,177),2,b
  368.    LINE (331,164)-(361,177),2,b
  369.    RETURN
  370. '
  371. 'End of program clean-up
  372. exit1:
  373.    TIMER OFF
  374.    COLLISION OFF
  375.    WINDOW CLOSE 1
  376.    MENU OFF
  377.    MENU RESET
  378.    OBJECT.OFF
  379.    SYSTEM
  380. '
  381. moonscape:                
  382. DATA 126, 126, 126, 126, 126, 127, 127, 128, 128, 129
  383. DATA 130, 130, 131, 131, 132, 133, 133, 134, 134, 135
  384. DATA 136, 136, 137, 137, 138, 138, 138, 138, 138, 138
  385. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  386. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  387. DATA 138, 138, 138, 138, 138, 138, 138, 138, 138, 138
  388. DATA 139, 139, 140, 140, 141, 142, 142, 143, 143, 144
  389. DATA 144, 144, 144, 144, 144, 144, 144, 144, 144, 144
  390. DATA 143, 143, 142, 142, 141, 140, 140, 139, 139, 138
  391. DATA 137, 137, 136, 136, 135, 134, 134, 133, 133, 132
  392. DATA 131, 131, 130, 130, 129, 128, 128, 127, 127, 126
  393. DATA 125, 125, 124, 124, 123, 122, 122, 121, 121, 120
  394. DATA 119, 118, 117, 116, 115, 114, 113, 112, 111, 110
  395. DATA 109, 108, 107, 106, 105, 104, 103, 102, 101, 100
  396. DATA 100, 100, 100, 101, 101, 101, 101, 101, 101, 101
  397. DATA 102, 102, 102, 102, 102, 102, 102, 102, 103, 103
  398. DATA 103, 103, 103, 103, 103, 104, 104, 104, 104, 104
  399. DATA 104, 104, 105, 105, 105, 105, 105, 105, 105, 105
  400. DATA 106, 106, 106, 106, 106, 106, 106, 107, 107, 107
  401. DATA 107, 107, 107, 107, 108, 108, 108, 108, 108, 108
  402. DATA 108, 108, 109, 109, 109, 109, 109, 109, 109, 110
  403. DATA 110, 110, 110, 110, 110, 110, 111, 111, 111, 111
  404. DATA 111, 111, 111, 111, 112, 112, 112, 112, 112, 112
  405. DATA 112, 113, 113, 113, 113, 113, 113, 113, 114, 114
  406. DATA 114, 114, 114, 114, 114, 114, 115, 115, 115, 115
  407. DATA 115, 115, 115, 116, 116, 116, 116, 116, 116, 116
  408. DATA 116, 117, 117, 117, 117, 117, 117, 117, 118, 118
  409. DATA 118, 118, 118, 118, 118, 119, 119, 119, 119, 119
  410. DATA 119, 119, 119, 120, 120, 120, 120, 120, 120, 120
  411. DATA 121, 121, 121, 121, 121, 121, 121, 122, 122, 122
  412. DATA 122, 122, 122, 122, 122, 123, 123, 123, 123, 123
  413. DATA 123, 123, 124, 124, 124, 124, 124, 124, 124, 125
  414. DATA 125, 125, 125, 125, 125, 125, 125, 126, 126, 126
  415. DATA 126, 126, 126, 126, 127, 127, 127, 127, 127, 127
  416. DATA 127, 128, 128, 128, 128, 128, 128, 128, 128, 129
  417. DATA 129, 129, 129, 129, 129, 129, 130, 130, 130, 130
  418. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  419. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  420. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  421. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  422. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  423. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  424. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  425. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  426. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  427. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  428. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  429. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  430. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  431. DATA 130, 130, 130, 130, 130, 130, 130, 130, 130, 130
  432. DATA 130, 131, 131, 131, 132, 132, 132, 132, 133, 133
  433. DATA 133, 134, 134, 134, 134, 135, 135, 135, 136, 136
  434. DATA 136, 137, 137, 137, 138, 138, 138, 138, 139, 139
  435. DATA 139, 140, 140, 140, 140, 141, 141, 141, 142, 142
  436. DATA 142, 143, 143, 143, 144, 144, 144, 144, 145, 145
  437. DATA 145, 145, 144, 144, 144, 143, 143, 143, 143, 142
  438. DATA 142, 142, 142, 141, 141, 141, 141, 140, 140, 140
  439. DATA 140, 139, 139, 139, 139, 138, 138, 138, 138, 137
  440. DATA 137, 137, 137, 136, 136, 136, 136, 135, 135, 135
  441. DATA 135, 134, 134, 134, 134, 133, 133, 133, 133, 132
  442. DATA 132, 132, 132, 131, 131, 131, 131, 130, 130, 130
  443. DATA 130, 129, 129, 129, 129, 128, 128, 128, 128, 127
  444. DATA 127, 127, 127, 126, 126, 126, 126, 126, 126, 126
  445. DATA 126, 126, 126, 126, 126, 126, 126, 126, 126, 126
  446. '
  447. lander:
  448. DATA   0,   0,   0,   0,   0,   0,   0,   0,   0,   0
  449. DATA   0,   2,   0,   0,   0,  11,   0,   0,   0,   9
  450. DATA   0,  24,   0,   3,   0,   0,   4,   0,  14,   0
  451. DATA  10,   0,  10,   0,  10,   0,  31,   0,  31,   0
  452. DATA  63, 128,  64,  64,   0,   0,   0,   0,   4,   0
  453. DATA   4,   0,   4,   0,  14,   0,  14,   0,   0,   0
  454. DATA   0,   0
  455. '
  456. END
  457.